# https://www.ricedata.cn/variety/index.htm 爬取此网站上（左侧）历年省级以上审定品种相关数据，加上二级页面翻页信息
# 第一步，把首页当中的每个省份的链接和名字获取下来。右键点击检查

import requests
from lxml import etree
import pandas as pd
import re
import time
import os  # 用于创建目录

# 定义数据保存路径（修改为指定路径）
SAVE_PATH = r'C:\Users\Administrator\Desktop\tianqi\tem_data'

# 第一步：获取首页中的各部门的链接网址
home_url = 'https://www.ricedata.cn/variety/index.htm'  # 目标网站的主页地址
home_response = requests.get(home_url)  # 生成请求
home_response.encoding = 'utf-8'  # 调整网页源码的编码方式
dom = etree.HTML(home_response.text)  # 解析网页源代码
region_href = dom.xpath('//div/a[@target="_blank"]/@href')  # 获取各部门的链接

# 过滤无效链接（仅保留包含'identified'的链接）
region_href = [href for href in region_href if 'identified/' in href]

region_name = dom.xpath('//div/a[@target="_blank"]//text()')
region_name = [i.replace('\u3000', '').strip() for i in region_name]  # 去除特殊字符并清理空白
region_name = [name for name in region_name if name]  # 过滤空名称
region_name[-3] = '未知地区'  # 修正特定名称（根据实际列表调整）

# 创建保存目录（若不存在）
if not os.path.exists(SAVE_PATH):
    os.makedirs(SAVE_PATH)
    print(f"已创建目录：{SAVE_PATH}")

##第二步：获取各个部门的数据
for nation_number in range(len(region_href)):
    # 跳过可能的无效索引（根据实际数据调整）
    if nation_number >= len(region_name):
        print(f"警告：跳过无效索引 {nation_number}")
        continue

    current_name = region_name[nation_number]
    print(f'\n正在获取 {current_name} 的数据==========================')
    sub_url = f'https://www.ricedata.cn/variety/{region_href[nation_number]}'  # 还原部门网址

    try:
        region_response = requests.get(sub_url)
        region_response.encoding = 'gb2312'
        region_dom = etree.HTML(region_response.text)

        try:
            # 第一种情况: 有末页按钮的情况
            page_number_last = region_dom.xpath('//a[@title="跳至末页"]/@href')
            if not page_number_last:
                raise ValueError("未找到末页链接")

            num = int(re.findall('\d+', page_number_last[0])[0])  # 总页数
            region_data = pd.DataFrame()

            for i in range(1, num + 1):
                # 构造分页URL（例如：将链接中的'_1.htm'替换为'_i.htm'）
                page_url = re.sub(r'_1\.htm$', f'_{i}.htm', sub_url)
                print(f'正在获取第 {i}/{num} 页：{page_url}')

                page_response = requests.get(page_url)
                page_response.encoding = 'gb2312'
                tables = pd.read_html(page_response.text, header=0)

                if not tables:
                    print(f"警告：第 {i} 页无表格数据")
                    continue

                mid = tables[0]
                region_data = region_data.append(mid, ignore_index=True)
                time.sleep(1)  # 控制请求频率

            # 保存数据
            filename = os.path.join(SAVE_PATH, f'{current_name}.csv')
            region_data.to_csv(filename, encoding='utf-8-sig', index=False)
            print(f"✅ 保存成功：{filename}")

        except Exception as e:
            print(f"第一种情况失败，尝试第二种情况：{e}")
            # 第二种情况：手动获取分页链接
            sub_url_list = region_dom.xpath('//a[@style="font-size:14"]/@href')
            region_data = pd.DataFrame()

            for idx, page in enumerate(sub_url_list, 1):
                page_url = f'https://www.ricedata.cn/variety/identified/{page}'
                print(f'正在获取分页 {idx}：{page_url}')

                page_response = requests.get(page_url)
                page_response.encoding = 'gb2312'
                tables = pd.read_html(page_response.text, header=0)

                if tables:
                    mid = tables[0]
                    region_data = region_data.append(mid, ignore_index=True)
                time.sleep(1)

            # 保存数据
            filename = os.path.join(SAVE_PATH, f'{current_name}.csv')
            region_data.to_csv(filename, encoding='utf-8-sig', index=False)
            print(f"✅ 保存成功：{filename}")

    except Exception as main_err:
        print(f"❌ 处理 {current_name} 失败：{main_err}")
        continue

print("\n数据爬取完成！")